001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Jan 19, 2003
005 * Time: 7:47:48 PM
006 */
007
008 package EVolve.util.settings;
009
010 import EVolve.Scene;
011 import EVolve.data.ElementDefinition;
012 import EVolve.visualization.Visualization;
013 import javax.swing.*;
014 import java.io.*;
015 import java.awt.event.*;
016 import java.awt.*;
017 import java.util.*;
018
019 public class SceneSetting extends Setting{
020 private static SceneSetting instance = null;
021 private JDialog settingDialog;
022 private JTextField textClassPath, textSourcePath, textVizConfigPath, textVizResultPath, textDefaultDataPath ;
023 private JButton buttonSave, buttonCancel;
024 private ArrayList additionClassPath, sourcePath;
025 private JButton[] buttonDir;
026
027
028 private SceneSetting() {
029 /*boolean isRunningUnderWindows = System.getProperty("os.name").startsWith("Windows");
030 String userHome = System.getProperty("user.home");
031 String evolveConfigFile = null;
032 if (userHome == null || userHome.trim().equals("")) {
033 // Fall back to current directory if undefined
034 userHome = ".";
035 }
036
037 if (!userHome.endsWith(String.valueOf(Character.toString(File.separatorChar)))) {
038 userHome += File.separatorChar;
039 }
040
041 if (isRunningUnderWindows) {
042 evolveConfigFile = "EVolve.ini";
043 } else {
044 evolveConfigFile = ".EVolve";
045 }
046 iniFilename = userHome + evolveConfigFile;*/
047 iniFilename = getFilenameWithPath("EVolve");
048
049 contents = new JTextField[5];
050 contents[0] = textDefaultDataPath = new JTextField(12);
051 contents[1] = textVizResultPath = new JTextField(12);
052 contents[2] = textVizConfigPath = new JTextField(12);
053 contents[3] = textClassPath = new JTextField(12);
054 contents[4] = textSourcePath = new JTextField(12);
055
056 tags = new String[5];
057 tags[0] = "[Default Data Path]";
058 tags[1] = "[Default Viz result path]";
059 tags[2] = "[Default Viz Config path]";
060 tags[3] = "[Additional class path]";
061 tags[4] = "[Source file path]";
062 buttonDir = new JButton[contents.length];
063 for (int i=0; i<buttonDir.length; i++) {
064 buttonDir[i] = new JButton("...");
065 buttonDir[i].setName(String.valueOf(i));
066 buttonDir[i].addActionListener(new ActionListener() {
067 public void actionPerformed(ActionEvent e) {
068 addPath();
069 }
070 });
071 }
072 additionClassPath = new ArrayList();
073 sourcePath = new ArrayList();
074 readDataFromFile();
075 }
076
077 public static SceneSetting v() {
078 if (instance == null)
079 instance = new SceneSetting();
080 return instance;
081 }
082
083 public void readDataFromFile() {
084 String line;
085 RandomAccessFile iniFile;
086 File file = new File(iniFilename);
087 if (!file.exists()) return;
088
089 try {
090 iniFile = new RandomAccessFile(file,"r");
091 line = iniFile.readLine();
092 /** ini file is organized as:
093 * [Default Data Path]
094 * [Viz result path]
095 * [Viz Config path]
096 * [Additional class path]
097 * [Source file path]
098 */
099 while (line!=null) {
100 line = iniFile.readLine();
101 if (line.length() != 0) {
102 textDefaultDataPath.setText(line);
103 }
104
105 line = iniFile.readLine(); //skip one tag
106 line = iniFile.readLine();
107 if (line.length() != 0) {
108 textVizResultPath.setText(line);
109 }
110
111 line = iniFile.readLine(); //skip one tag
112 line = iniFile.readLine();
113 if (line.length() != 0) {
114 textVizConfigPath.setText(line);
115 }
116
117 line = iniFile.readLine(); //skip one tag
118 line = iniFile.readLine();
119 if (line.length() != 0) {
120 additionClassPath.clear();
121 textClassPath.setText(line);
122 StringTokenizer token = new StringTokenizer(line+File.pathSeparator,File.pathSeparator);
123 while (token.hasMoreTokens()) {
124 additionClassPath.add(token.nextToken());
125 }
126 }
127
128 line = iniFile.readLine(); //skip one tag
129 line = iniFile.readLine();
130 if (line.length() != 0) {
131 sourcePath.clear();
132 textSourcePath.setText(line);
133 StringTokenizer token = new StringTokenizer(line+File.pathSeparator,File.pathSeparator);
134 while (token.hasMoreTokens()) {
135 sourcePath.add(token.nextToken());
136 }
137 }
138 line = iniFile.readLine();
139 }
140 } catch (IOException e) {
141 Scene.showErrorMessage("Unable to read EVolve setting file \""+iniFilename+"\"");
142 return;
143 }
144 Scene.getUIManager().setLastConfigDir(textVizConfigPath.getText());
145 Scene.getUIManager().setLastDataDir(textDefaultDataPath.getText());
146 Scene.getUIManager().setLastResultDir(textVizResultPath.getText());
147 }
148
149 public void showSettingDialog() {
150 Box boxMain = new Box(BoxLayout.Y_AXIS);
151 dialog = new JDialog(Scene.getFrame(), "Set path...", true);
152 dialog.setSize(600,300);
153
154 for (int i=0; i<tags.length; i++) {
155 String prompt = tags[i].substring(1,tags[i].length()-1) + ":";
156 boxMain.add(createPathItem(prompt, contents[i],buttonDir[i]));
157 boxMain.add(Box.createVerticalStrut(20));
158 }
159
160 Box boxSaveCancel = new Box(BoxLayout.X_AXIS);
161 buttonSave = new JButton("Save");
162 buttonSave.addActionListener(new ActionListener() {
163 public void actionPerformed(ActionEvent e) {
164 save();
165 dialog.setVisible(false);
166 }
167 });
168
169 buttonCancel = new JButton("Cancel");
170 buttonCancel.addActionListener(new ActionListener() {
171 public void actionPerformed(ActionEvent e) {
172 dialog.setVisible(false);
173 }
174 });
175 boxSaveCancel.add(Box.createHorizontalStrut(40));
176 boxSaveCancel.add(buttonSave);
177 boxSaveCancel.add(Box.createHorizontalStrut(25));
178 boxSaveCancel.add(buttonCancel);
179
180 boxMain.add(boxSaveCancel);
181 dialog.getContentPane().add(boxMain);
182 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
183 }
184
185 private Box createPathItem(String prompt, JTextField item, JButton button) {
186 Box itemBox = new Box(BoxLayout.X_AXIS);
187
188 itemBox.add(new JLabel(prompt));
189 itemBox.add(Box.createHorizontalStrut(15));
190 itemBox.add(item);
191 itemBox.add(Box.createHorizontalStrut(10));
192 itemBox.add(button);
193 return itemBox;
194 }
195
196 public void showCurrentSetting() {
197 createSettingDialog();
198 }
199
200 private void createSettingDialog() {
201 Box boxMain = new Box(BoxLayout.Y_AXIS);
202 String setting;
203 int index;
204
205 settingDialog = new JDialog(Scene.getFrame(), "Current Setting", true);
206 settingDialog.setSize(500,500);
207
208 // show data source and its path
209 setting = Scene.getCurrentDataFilename();
210 index = setting.lastIndexOf(File.separatorChar);
211 if (index == -1) { // have not loaded date yet
212 boxMain.add(createInfoItem("Data source name:", "N/A"));
213 boxMain.add(Box.createVerticalStrut(20));
214 boxMain.add(createInfoItem("Data source path:", "N/A"));
215 } else {
216 boxMain.add(createInfoItem("Data source name:", setting.substring(index+1)));
217 boxMain.add(Box.createVerticalStrut(20));
218 boxMain.add(createInfoItem("Data source path:", setting.substring(0,index)));
219 }
220 boxMain.add(Box.createVerticalStrut(20));
221
222 // show path info
223 for (int i=0; i<tags.length; i++) {
224 String prompt = tags[i].substring(1,tags[i].length()-1) + ":";
225 boxMain.add(createInfoItem(prompt, contents[i].getText()));
226 boxMain.add(Box.createVerticalStrut(20));
227 }
228
229 // show current visualization info
230 HashMap config = readVizSetting();
231 if (config != null) {
232 boxMain.add(createInfoItem("Visualization: ", (String)config.get("Name")));
233 boxMain.add(createInfoItem("Subject: ",((ElementDefinition)config.get("Subject")).getName()));
234 EVolve.visualization.Dimension[] dims = (EVolve.visualization.Dimension[])config.get("Dimension");
235 for (int i=0; i<dims.length; i++)
236 boxMain.add(createInfoItem("Dimension "+(char)(88+i)+" ",dims[i].getName()));
237 boxMain.add(createInfoItem("Interval",config.get("Interval").toString()));
238 } else {
239 boxMain.add(createInfoItem("Visualization: ", "N/A"));
240 boxMain.add(createInfoItem("Subject: ","N/A"));
241 for (int i=0; i<3; i++)
242 boxMain.add(createInfoItem("Dimension "+(char)(88+i)+" ","N/A"));
243 boxMain.add(createInfoItem("Interval","N/A"));
244 }
245
246
247 // create button box
248 JButton buttonOK = new JButton("OK");
249 buttonOK.addActionListener(new ActionListener() {
250 public void actionPerformed(ActionEvent e) {
251 settingDialog.setVisible(false);
252 }
253 });
254 JPanel panelButton = new JPanel(new BorderLayout());
255 panelButton.add(buttonOK,BorderLayout.CENTER);
256 boxMain.add(panelButton);
257
258 settingDialog.getContentPane().add(boxMain);
259 Scene.getUIManager().showDialog(settingDialog, settingDialog.getWidth(), settingDialog.getHeight());
260 }
261
262 private Box createInfoItem(String prompt, String info) {
263 Box item = new Box(BoxLayout.X_AXIS);
264 item.add(new JLabel(prompt));
265 item.add(Box.createHorizontalStrut(15));
266 item.add(new JTextField(info));
267 return item;
268 }
269
270 private void addPath() {
271 int activeButtonId = 0;
272 for (int i=0; i<buttonDir.length; i++) {
273 if (buttonDir[i].isFocusOwner()) {
274 activeButtonId = i;
275 break;
276 }
277 }
278 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastDataDir());
279 String newPath;
280
281 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
282
283 if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
284 newPath = fc.getSelectedFile().getAbsolutePath();
285 switch (activeButtonId) {
286 case 3:
287 case 4:
288 String oldPath = contents[activeButtonId].getText();
289 if (oldPath.length() != 0)
290 newPath = oldPath + File.pathSeparator + newPath;
291 case 0:
292 case 1:
293 case 2:
294 contents[activeButtonId].setText(newPath);
295 break;
296 }
297 }
298
299 }
300
301 public ArrayList getAdditionalClassPath() {
302 return additionClassPath;
303 }
304
305 public ArrayList getSourcePath() {
306 return sourcePath;
307 }
308
309 private HashMap readVizSetting() {
310 ArrayList list = Scene.getVisualizationManager().getVisualizationList();
311
312 Visualization visual = null;
313 for (int i=0; i<list.size();i++) {
314 visual = (Visualization)list.get(i);
315 if (visual.getWindow().isSelected()) break;
316 }
317
318 if (visual != null)
319 return visual.getCurrentConfigure();
320 else
321 return null;
322 }
323
324 }
325